﻿#ifndef __LOG2810__automate__
#define __LOG2810__automate__

/*
 * • Automate qui decrit l’automate proprement dit : les etats et les transitions.
 */

#include <iostream>
#include <string>
#include <list>
#include <vector>
#include "Etat.h"
#include "Transition.h"

class Transition;
class Etat;
class Automate {
    
public:

    // Constructeur
    Automate();

	//Constructeur par paramètres
	Automate(std::vector <Etat> etats/*,std::vector <Transition> transitions*/);

	//Constructeur avec fichier
	Automate(std::string fichier);

    // Destructeur
    ~Automate();
  
	//fonctions sur m_etats
	std::vector<Etat> getEtats();
	void setTransition(std::vector<Etat> etats);

	//fonctions sur m_transitions
	/*std::vector<Transition> getTransitions();
	void setTransition(std::vector<Transition> transitions);*/

	/*
	 * Ajoutez a la classe Automate, une methode qui retourne l’etat initial.
	 */
	Etat getEtatInitial();

	/*
	 * Ajoutez a la classe Automate, une methode void genererFichierAutomate(String fichier)
	 * qui, a partir d un nom de ﬁchier, cree le ﬁchier qui correspond a l’automate courant. Le format
	 * de ﬁchier est celui considere ci-dessus.
	 */
	void genererFichierAutomate(std::string fichier);

	/*    RF1
	 * Ajoutez a la classe Automate une methode boolean estDeterministe() qui permet de savoir
	 * si l’automate est d´eterministe ou non. Il faudra donc inspecter chaque etat pour voir s’il n’a
	 * pas plus d’une transition associee a chaque symbole. Attention: il ne vous est pas demande de
	 * determiniser l’automate.
	 */
	bool estDeterministe();
    
    /*    RF2
     Ajoutez `a la classe Automate la m ́ethode Automate minimiserAutomate() impl ́ementant l’algorithme de     minimisation d’un automate (Voir Section 6.1) et qui retourne l’automate minimal  ́equivalent `a l’automate courant.
     */
    Automate minimiserAutomate();
    
	/*    RF3
	 * Ajoutez a la classe Automate, une methode boolean reconnaitreMot(string mot) qui dit si
	 * un mot donne sous la forme d’une chaıne de caracteres, est reconnu par l’automate courant.
	 */
	// attention : ne fonctionne que dans le cas d'un automate deterministe !!!
	bool reconnaitreMot(std::string mot);

private:
	// a voir si le conteneur "vector" est ideal
    std::vector <Etat> m_etats; // contient la liste des etats de l'automate
   // std::vector <Transition> m_transitions; // contient la liste de toutes les transitions présentes dans l'automate --> besoin ?
};

#endif /* defined(__LOG2810__automate__) */